package com.jinghangzz.shop.back.controller;

import java.io.InputStream;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;

import com.alibaba.fastjson.JSONObject;
import com.jinghangzz.shop.common.controller.BaseController;
import com.jinghangzz.shop.common.util.ConstatFinalUtil;
import com.jinghangzz.shop.common.util.PageInfoUtil;
import com.jinghangzz.shop.goods.pojo.AGoods;
import com.jinghangzz.shop.goods.pojo.AGoodsBrand;
import com.jinghangzz.shop.goods.pojo.AGoodsCate;
import com.jinghangzz.shop.goods.service.IGoodsOperService;
import com.jinghangzz.shop.goods.service.IGoodsService;

/**
 * 商品模块的Controller
 * @author TeaBig
 */
@Controller
@RequestMapping("/back/goods")
public class GoodsBackController extends BaseController
{
	@Resource
	private IGoodsService goodsService ; 
	@Resource
	private IGoodsOperService goodsOperService;
	
	
	/*=========品牌模块操作开始=============*/
	/**
	 * 品牌列表
	 * Controller里面的代码就是当年Servlet中的代码.
	 * 就是把Junit中的代码拿过来
	 * 		这代码所中所有的写死的部分,问jsp(请求体要); a=1&b=2&c=3
	 * @return
	 */
	@RequestMapping("/brandList")
	public String brandList(HttpServletRequest request,Model model)
	{
		ConstatFinalUtil.SYS_LOGGER.info("GoodsBackController---goodsBrandList");
		/* 搜索条件 */
		Map<String, Object> condMap = new HashMap<String, Object>();
		/* 准备搜索条件 */
		proccedSearchCond(request, condMap);
		/* 生成分页工具类放到单独的一个方法中 */
		PageInfoUtil pageInfoUtil = proccedPageInfoUtil(request);
		
		/* 查询多条记录 */
		List<AGoodsBrand> goodsBrandList = this.goodsService.findCondListGoodsBrandService(pageInfoUtil,condMap);
		
		/* 把路径相关的信息放到request中 */
		String webPath = ConstatFinalUtil.SYS_CONFIG_JSON.getString("file.webPath") ; 
		model.addAttribute("webPath", webPath);
		
		/* 因为Controller要跳转到jsp上面,
		 * 得需要把List放到request中 */
		model.addAttribute("brandList", goodsBrandList);
		model.addAttribute("pageInfoUtil", pageInfoUtil);
		return "/back/goods/brandList" ; 
	}

	/**
	 * 打开品牌添加的页面
	 * @return
	 */
	@RequestMapping("/brandInsert")
	public String brandInsert()
	{
		ConstatFinalUtil.SYS_LOGGER.info("GoodsBackController---goodsBrandInsert");
		return "/back/goods/brandInsert" ; 
	}
	
	/**
	 * 添加提交操作
	 * 	 目的是要入库:
	 * Controller的代码就是把junit中的代码拷贝过来,
	 * 把里面的死值换成活值
	 * 
	 * 接收参数
	 * 处理参数
	 * new对象
	 * 赋值
	 * 
	 * 请求体中的信息:键得和pojo的属性名一样
	 * 
	 * 返回值期望是一个json
	 * @return
	 */
	@RequestMapping(value = "/brandInsertSubmit",produces = "text/html;charset=UTF-8")
	@ResponseBody
	public String brandInsertSubmit(AGoodsBrand goodsBrand,String pubTimeStr,Model model)
	{
		ConstatFinalUtil.SYS_LOGGER.info("GoodsBackController---brandInsertSubmit");
		JSONObject resultDbJSON = new JSONObject();
		/* 先让Spring的驱动自动赋值
		 * 如果赋值失败,我再兜底 */
		/* 发布时间:时间赋值,
		 * 转换器
		 * 手动赋值
		 *  */
		Date pubTime = this.dateUtil.strToDateTime(pubTimeStr);
		goodsBrand.setPubTime(pubTime);
		
		/* 管理员id,存储的是当前登陆的管理员,
		 * 要从session中获取管理对象,并且取到id */
		
		try
		{
			resultDbJSON = this.goodsService.saveOneGoodsBrandService(goodsBrand );
			ConstatFinalUtil.SYS_LOGGER.info("返回结果:{}",resultDbJSON.toJSONString());
			//this.info = resultDbJSON.getString("info");
		} catch (Exception e)
		{
			ConstatFinalUtil.SYS_LOGGER.error("保存报错了,",e);
			info = "保存抛异常了;异常信息:" + e.toString(); 
		}
		/* 要把提示信息放到request中 */
		//model.addAttribute("info", info);
		return resultDbJSON.toJSONString() ; 
	}
	
	/**
	 * 打开品牌更新的页面
	 * @return
	 */
	@RequestMapping("/brandUpdate")
	public String brandUpdate(int id,String operType , Model model)
	{
		ConstatFinalUtil.SYS_LOGGER.info("GoodsBackController---brandUpdate");
		/* 根据Id查询品牌
		 * junit中的查询单条
		 *  */
		/* 搜索条件 */
		Map<String, Object> condMap = new HashMap<String, Object>();
		/* 为啥map的键要是id呢?
		 * 因为映射文件中指定的sql语句标签,#{id}
		 *  */
		condMap.put("id", id);
		/* 查询一条品牌 */
		AGoodsBrand goodsBrand = this.goodsService.findOneGoodsBrandService(condMap);
		/* 把品牌放到request中 */
		model.addAttribute("brand", goodsBrand);
		
		/* 把路径相关的信息放到request中 */
		String webPath = ConstatFinalUtil.SYS_CONFIG_JSON.getString("file.webPath") ; 
		model.addAttribute("webPath", webPath);
		
		if("update".equalsIgnoreCase(operType))
		{
			/* 更新页面 */
			return "/back/goods/brandUpdate" ; 
		}else if("updateFile".equalsIgnoreCase(operType))
		{
			/* 更新页面 */
			return "/back/goods/brandUpdateFile" ; 
		}
		/* 查看操作 */
		return "/back/goods/brandInfo" ; 
	}
	
	/**
	 * 品牌更新提交操作
	 * @return
	 */
	@RequestMapping(value = "/brandUpdateSubmit",produces = "text/html;charset=UTF-8")
	@ResponseBody
	public String goodsBrandUpdateSubmit(int id,String operType , String pubTimeStr,Model model,
			HttpServletRequest request)
	{
		ConstatFinalUtil.SYS_LOGGER.info("GoodsBackController---brandUpdateSubmit");
		JSONObject resultDbJSON = new JSONObject();
		/* 根据Id查询品牌
		 * junit中的查询单条
		 *  */
		/* 搜索条件 */
		Map<String, Object> condMap = new HashMap<String, Object>();
		/* 为啥map的键要是id呢?
		 * 因为映射文件中指定的sql语句标签,#{id}
		 *  */
		condMap.put("id", id);
		/* 查询一条品牌 */
		AGoodsBrand goodsBrand = this.goodsService.findOneGoodsBrandService(condMap);
		/* 把品牌放到request中 */
		model.addAttribute("goodsBrand", goodsBrand);
		
		/* 更新一些属性 */
		/* 一一的接收参数,采用request方法来做 */
		String name = request.getParameter("name");
		String website = request.getParameter("website");
		String status = request.getParameter("status");
		String content = request.getParameter("content");
		
		goodsBrand.setName(name);
		goodsBrand.setWebsite(website);
		goodsBrand.setContent(content);
		goodsBrand.setStatus(Byte.valueOf(status));
		 
		
		/* 先让Spring的驱动自动赋值
		 * 如果赋值失败,我再兜底 */
		/* 发布时间:时间赋值,
		 * 转换器
		 * 手动赋值
		 *  */
		Date pubTime = this.dateUtil.strToDateTime(pubTimeStr);
		goodsBrand.setPubTime(pubTime);
		
		try
		{
			/* 更新一条记录 */
			resultDbJSON = this.goodsService.updateOneGoodsBrandService(goodsBrand);
			ConstatFinalUtil.SYS_LOGGER.info("返回结果:{}",resultDbJSON.toJSONString());
			//this.info = resultDbJSON.getString("info");
		} catch (Exception e)
		{
			ConstatFinalUtil.SYS_LOGGER.error("保存报错了,",e);
			info = "保存抛异常了;异常信息:" + e.toString(); 
		}
		/* 要把提示信息放到request中 */
		//model.addAttribute("info", info);
		return resultDbJSON.toJSONString() ; 
	}
	
	/**
	 * 品牌更新提交操作
	 * @return
	 */
	@RequestMapping(value = "/brandUpdateFileSubmit",produces = "text/html;charset=UTF-8")
	@ResponseBody
	public String brandUpdateFileSubmit(int brandid,
			MultipartFile file,
			Model model,
			HttpServletRequest request)
	{
		ConstatFinalUtil.SYS_LOGGER.info("GoodsBackController---brandUpdateFileSubmit");
		JSONObject resultDbJSON = new JSONObject();
		
		ConstatFinalUtil.SYS_LOGGER.info("文件名:{},文件大小:{},表单名:{}",file.getOriginalFilename(),file.getSize(),file.getName());
		try
		{
			String originalFilename = file.getOriginalFilename() ; 
			InputStream inputStream = file.getInputStream() ;
			
			/* 根据id查询品牌 */
			Map<String, Object> condMap = new HashMap<String, Object>();
			condMap.put("id", brandid);
			AGoodsBrand goodsBrand = this.goodsService.findOneGoodsBrandService(condMap);
			
			Map<String, Object> paramsMap = new HashMap<String, Object>();
			/* 因为在Service方法中使用到了,所以必须先放到map中 */
			paramsMap.put("originalFilename", originalFilename);
			paramsMap.put("inputStream", inputStream);
			/* 更新品牌,并且上传文件 */
			resultDbJSON = this.goodsService.updateOneGoodsBrandService(goodsBrand, paramsMap);
		} catch (Exception e)
		{
			e.printStackTrace();
		} 
		return resultDbJSON.toJSONString() ; 
	}
	/*=========品牌模块操作结束=============*/
	
	/*=========分类操作开始=============*/
	/**
	 * 分类列表
	 * @return
	 */
	@RequestMapping("/cateList")
	public String cateList(HttpServletRequest request,Model model)
	{
		ConstatFinalUtil.SYS_LOGGER.info("UsersHeadController---dynastyList");
		/* 搜索条件 */
		Map<String, Object> condMap = new HashMap<String, Object>();
		/* 准备搜索条件 */
		proccedSearchCond(request, condMap);
		/* 生成分页工具类放到单独的一个方法中 */
		PageInfoUtil pageInfoUtil = proccedPageInfoUtil(request);
		
		/* 查询多条记录 */
		List<AGoodsCate> cateList = this.goodsService.findCondListGoodsCateService(pageInfoUtil, condMap);
		
		/* 因为Controller要跳转到jsp上面,
		 * 得需要把List放到request中 */
		model.addAttribute("cateList", cateList);
		model.addAttribute("pageInfoUtil", pageInfoUtil);
		return "/back/goods/cateList" ; 
	}
	
	/**
	 * 树形结构
	 * @return
	 */
	@RequestMapping("/cateTreeList")
	public String cateTreeList(HttpServletRequest request,Model model)
	{
		ConstatFinalUtil.SYS_LOGGER.info("UsersHeadController---cateTreeList");
		/* 搜索条件 */
		Map<String, Object> condMap = new HashMap<String, Object>();
		/* 查询多条记录 */
		List<AGoodsCate> cateList = this.goodsService.findCondListGoodsCateService(null, condMap);
		
		/* 因为Controller要跳转到jsp上面,
		 * 得需要把List放到request中 */
		model.addAttribute("cateList", cateList);
		return "/back/goods/cateTreeList" ; 
	}
	/*=========分类操作开始=============*/
	
	/*=========商品模块操作开始=============*/
	/**
	 * 商品列表
	 * Controller里面的代码就是当年Servlet中的代码.
	 * 就是把Junit中的代码拿过来
	 * 		这代码所中所有的写死的部分,问jsp(请求体要); a=1&b=2&c=3
	 * @return
	 */
	@RequestMapping("/goodsList")
	public String goodsList(HttpServletRequest request,Model model)
	{
		ConstatFinalUtil.SYS_LOGGER.info("GoodsBackController---goodsList");
		/* 搜索条件 */
		Map<String, Object> condMap = new HashMap<String, Object>();
		/* 准备搜索条件 */
		proccedSearchCond(request, condMap);
		/* 生成分页工具类放到单独的一个方法中 */
		PageInfoUtil pageInfoUtil = proccedPageInfoUtil(request);
		
		/* 查询多条记录 */
		List<AGoods> goodsList = this.goodsService.findCondListGoodsService(pageInfoUtil,condMap);
		
		/* 因为Controller要跳转到jsp上面,
		 * 得需要把List放到request中 */
		model.addAttribute("goodsList", goodsList);
		model.addAttribute("pageInfoUtil", pageInfoUtil);
		return "/back/goods/goodsList" ; 
	}
	
	/**
	 * 打开商品添加的页面
	 * @return
	 */
	@RequestMapping("/goodsInsert")
	public String goodsInsert()
	{
		ConstatFinalUtil.SYS_LOGGER.info("UsersHeadController---goodsInsert");
		return "/back/goods/goodsInsert" ; 
	}
	
	/**
	 * 添加提交操作
	 * 	 目的是要入库:
	 * Controller的代码就是把junit中的代码拷贝过来,
	 * 把里面的死值换成活值
	 * 
	 * 接收参数
	 * 处理参数
	 * new对象
	 * 赋值
	 * 
	 * 请求体中的信息:键得和pojo的属性名一样
	 * 
	 * 返回值期望是一个json
	 * @return
	 */
	@RequestMapping(value = "/goodsInsertSubmit",produces = "text/html;charset=UTF-8")
	@ResponseBody
	public String goodsInsertSubmit(AGoods goods,String pubTimeStr,Model model)
	{
		ConstatFinalUtil.SYS_LOGGER.info("UsersHeadController---goodsInsertSubmit");
		JSONObject resultDbJSON = new JSONObject();
		/* 先让Spring的驱动自动赋值
		 * 如果赋值失败,我再兜底 */
		/* 发布时间:时间赋值,
		 * 转换器
		 * 手动赋值
		 *  */
		Date pubTime = this.dateUtil.strToDateTime(pubTimeStr);
		goods.setPubTime(pubTime);
		
		try
		{
			resultDbJSON = this.goodsService.saveOneGoodsService(goods );
			ConstatFinalUtil.SYS_LOGGER.info("返回结果:{}",resultDbJSON.toJSONString());
			//this.info = resultDbJSON.getString("info");
		} catch (Exception e)
		{
			ConstatFinalUtil.SYS_LOGGER.error("保存报错了,",e);
			info = "保存抛异常了;异常信息:" + e.toString(); 
		}
		/* 要把提示信息放到request中 */
		//model.addAttribute("info", info);
		return resultDbJSON.toJSONString() ; 
	}
	
	/**
	 * 打开商品更新的页面
	 * @return
	 */
	@RequestMapping("/goodsUpdate")
	public String goodsUpdate(int id,String operType , Model model)
	{
		ConstatFinalUtil.SYS_LOGGER.info("UsersHeadController---goodsUpdate");
		/* 根据Id查询商品
		 * junit中的查询单条
		 *  */
		/* 搜索条件 */
		Map<String, Object> condMap = new HashMap<String, Object>();
		/* 为啥map的键要是id呢?
		 * 因为映射文件中指定的sql语句标签,#{id}
		 *  */
		condMap.put("id", id);
		/* 查询一条商品 */
		AGoods goods = this.goodsService.findOneGoodsService(condMap);
		/* 把商品放到request中 */
		model.addAttribute("goods", goods);
		if("update".equalsIgnoreCase(operType))
		{
			/* 查询所有的商品品牌(启用的) */
			condMap.clear();
			condMap.put("status","1");
			List<AGoodsBrand> brandList = this.goodsService.findCondListGoodsBrandService(null, condMap);
			/* 把品牌放到request中 */
			model.addAttribute("brandList", brandList);
			
			/* 查询所有的商品分类(启用的) */
			condMap.clear();
			//condMap.put("status","1");
			//List<AGoodsCate> cateList = this.goodsService.findCondListGoodsCateService(null, condMap);
			List<AGoodsCate> cateList = this.goodsOperService.findListCateTreeService(null);
			/* 把品牌放到request中 */
			model.addAttribute("cateList", cateList);
			/* 更新页面 */
			return "/back/goods/goodsUpdate" ; 
		}
		/* 查看操作 */
		return "/back/goods/goodsInfo" ; 
	}
	
	/**
	 * 商品更新提交操作
	 * @return
	 */
	@RequestMapping(value = "/goodsUpdateSubmit",produces = "text/html;charset=UTF-8")
	@ResponseBody
	public String goodsUpdateSubmit(int id,String operType , String pubTimeStr,Model model,
			HttpServletRequest request)
	{
		ConstatFinalUtil.SYS_LOGGER.info("UsersHeadController---goodsUpdateSubmit");
		JSONObject resultDbJSON = new JSONObject();
		/* 根据Id查询商品
		 * junit中的查询单条
		 *  */
		/* 搜索条件 */
		Map<String, Object> condMap = new HashMap<String, Object>();
		/* 为啥map的键要是id呢?
		 * 因为映射文件中指定的sql语句标签,#{id}
		 *  */
		condMap.put("id", id);
		/* 查询一条商品 */
		AGoods goods = this.goodsService.findOneGoodsService(condMap);
		/* 把商品放到request中 */
		model.addAttribute("goods", goods);
		
		/* 更新一些属性 */
		/* 一一的接收参数,采用request方法来做 */
		String cateId = request.getParameter("cateId");
		String brandId = request.getParameter("brandId");
		String name = request.getParameter("name");
		String title = request.getParameter("title");
		String url = request.getParameter("url");
		String weight = request.getParameter("weight");
		String remainNum = request.getParameter("remainNum");
		String marketPrice = request.getParameter("marketPrice");
		String price = request.getParameter("price");
		String status = request.getParameter("status");
		String content = request.getParameter("content");
		
		goods.setName(name);
		goods.setStatus(Byte.valueOf(status));
		
		goods.setCateId(Integer.valueOf(cateId));
		goods.setBrandId(Integer.valueOf(brandId));
		goods.setTitle(title);
		goods.setUrl(url);
		goods.setWeight(Double.valueOf(weight));
		goods.setRemainNum(Integer.valueOf(remainNum));
		goods.setMarketPrice(Double.valueOf(marketPrice));
		goods.setPrice(Double.valueOf(price));
		goods.setContent(content);
		
		/* 先让Spring的驱动自动赋值
		 * 如果赋值失败,我再兜底 */
		/* 发布时间:时间赋值,
		 * 转换器
		 * 手动赋值
		 *  */
		Date pubTime = this.dateUtil.strToDateTime(pubTimeStr);
		goods.setPubTime(pubTime);
		
		try
		{
			/* 更新一条记录 */
			resultDbJSON = this.goodsService.updateOneGoodsService(goods);
			ConstatFinalUtil.SYS_LOGGER.info("返回结果:{}",resultDbJSON.toJSONString());
			//this.info = resultDbJSON.getString("info");
		} catch (Exception e)
		{
			ConstatFinalUtil.SYS_LOGGER.error("保存报错了,",e);
			info = "保存抛异常了;异常信息:" + e.toString(); 
		}
		/* 要把提示信息放到request中 */
		//model.addAttribute("info", info);
		return resultDbJSON.toJSONString() ; 
	}
	/*=========商品模块操作结束=============*/
}
